发一些大三操作系统的实验代码吸引阅读量吧,当时做实验的时候看见网上很多人写的代码并不好,而且很多人都有错误的地方。如果好的话希望能点赞关注。
本篇文章选自课程设计报告的部分,所以相比前两篇实验详细很多,我尽量贴一些重要的部分出来
在多道程序系统中,多个进程在运行中对于资源的争夺而造成了一种僵局—死锁,若无外力作用,则这些进程均无法向前推进。如此,寻求避免死锁的方法就显得尤为重要。死锁产生的原因一般有三种:竞争不可抢占性资源、竞争可消耗性资源、进程的推进顺序不当。因此,在当前有限资源下,找到一组合法的顺序(称之为安全序列)执行,便能有效的避免死锁的产生。银行家算法便是最有代表性的避免死锁的算法,它是由艾兹格·迪杰斯特拉在1965年为T.H.E系统设计的一种避免死锁产生的算法。本次课程设计通过设计并编写程序来模拟银行家算法的执行过程。
一、数据结构的选择
a.将每个进程都视作一个对象,因此使用类进行存储和读取,并重载运算符用于数据的拷贝。为了实现资源数的可变性,则使用STL(Standard Template Library标准模板库,C++的一部分)中的vector容器存储各资源已用的资源和需要的资源数(int型)。类的定义如下所示:
class Process//使用一个类的对象表示一个进程
{public:
stringID;//进程名
vector<int>UsedResource;//已用各资源数
vector<int>NeedResource;//对应的所需资源数
Process&operator=(constProcess &p) //运算符重载用于赋值
{
if(this != &p)
{
this->ID= p.ID;
this->UsedResource= p.UsedResource;
this->NeedResource= p.NeedResource;
}
return*this;
}
};
b.为了对进程数和资源数进行存储,分别定义了int型变量ProcessCount、ResourceCount用于存储进程数和资源数。
c.为了对各资源的可用资源数进行存储和读取,定义了vector<int>Available用于存储可用资源数。
d.为了存储各进程的信息,使用对象的list,即STL中的链表list<Process> n。
e.因为在安全性算法运算时需要更改进程中的资源信息和当前可用资源信息,所以分别定义了list<Process> Copy、list<Process> Copy_2、vector<int>calc在运算前对当前进程的链表和当前资源信息进行拷贝,并用以运算。
f.因为对进程的初始化较为繁琐,所以定义了list<int>UsedResourceBuffer、list<int>NeedResourceBuffer用于对Process的初始化。
g.定义了list<string>Safeyqueue用于存储安全序列。
二、模块的划分
由于算法规模较小,所以大多数的实现均将其写在main函数中的while循环体中,需要使用的变量等也尽量定义为全局变量。但在选择后分别完成了不同的且重要的功能。除main函数中的部分,其它单独出的模块的功能如下:
a.SetProcess:对单个进程的信息进行初始化,返回初始化完成的进程对象。
b.ShowAllProcess:对所有进程进行显示
c.safetyCheak:用于安全性算法,并对安全序列进行初始化
d.ShowQueue:显示安全序列的情况。
</